package business.services;

import java.security.NoSuchAlgorithmException;
import common.Contexto;
import data.entities.Usuario;
import data.repository.IRepository;
import data.repository.QueryParameter;
import data.repository.Repository;
import data.repository.RepositoryException;

public class ServicioUsuarios implements IServicioUsuarios {
	private IRepository<Usuario> repositorioUsuarios;
	
	public ServicioUsuarios() {
		this.repositorioUsuarios = new Repository<Usuario>();
	}
	
	public Boolean loguearUsuario(String usuario, String password) throws ServiceException {
		Boolean usuarioLogueado = false;
		String queryExpression = "from Usuario u where u.usuario = :usuario";
		QueryParameter parameter = new QueryParameter("usuario", usuario);
		Usuario usuarioExistente = null;
		
		try {
			 usuarioExistente = this.repositorioUsuarios.get(queryExpression, parameter);
			 
			 if(usuarioExistente == null) {
				 String mensaje = String.format("No existe %s como usuario registrado", usuario);
				 
				 throw new ServiceException(mensaje);
			 }
			 
			String passwordHasheado;
			
			try {
				passwordHasheado = Contexto.getHash(password);
			} catch (NoSuchAlgorithmException e) {
				throw new ServiceException(e);
			}
			
			 if(usuarioExistente.getPassword().equals(passwordHasheado)) {
				 usuarioLogueado = true;
			 }
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}	
		
		return usuarioLogueado;
	}
	
	public void crearUsuario(String usuario, String nombre, String password)
			throws ServiceException {
		if(this.existeUsuario(usuario)) {
			String mensaje = String.format("%s ya existe como usuario registrado", usuario);
			 
			throw new ServiceException(mensaje);
		}
		
		String passwordHasheado;
		
		try {
			passwordHasheado = Contexto.getHash(password);
		} catch (NoSuchAlgorithmException e) {
			throw new ServiceException(e);
		}
		
		
		Usuario newUsuario = new Usuario();
		newUsuario.setUsuario(usuario);
		newUsuario.setNombre(nombre);
		newUsuario.setPassword(passwordHasheado);
		
		try {
			this.repositorioUsuarios.saveOrUpdate(newUsuario);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}
	
	public Boolean existeUsuario(String usuario) throws ServiceException {
		String queryExpression = "from Usuario u where u.usuario = :usuario";
		QueryParameter parameter = new QueryParameter("usuario", usuario);
		Usuario usuarioExistente = null;
		
		try {
			 usuarioExistente = this.repositorioUsuarios.get(queryExpression, parameter);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
		
		return usuarioExistente != null;
	}
}
